{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 香农熵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 香农熵代码实现"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 59,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "row_data = {'是否陪伴' :[0,0,0,1,1],\n",
    "            '是否玩游戏':[1,1,0,1,1],\n",
    "            '渣男' :['是','是','不是','不是','不是']}\n",
    "dataSet = pd.DataFrame(row_data) \n",
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9709505944546686"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "def calEnt(dataSet):\n",
    "    n = dataSet.shape[0] #拿到总行数\n",
    "    iset = dataSet.iloc[:,-1].value_counts() #统计标签类别\n",
    "    p = iset/n #得到每一类标签所占比\n",
    "    ent = (-p*np.log2(p)).sum() #计算信息熵\n",
    "    return ent\n",
    "    \n",
    "#计算全体数据的信息熵---根据标签列去进行计算的\n",
    "calEnt(dataSet) "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 信息增益"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>0</th>\n",
       "      <th>1</th>\n",
       "      <th>2</th>\n",
       "      <th>3</th>\n",
       "      <th>4</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>是否陪伴</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>是否玩游戏</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>渣男</th>\n",
       "      <td>是</td>\n",
       "      <td>是</td>\n",
       "      <td>不是</td>\n",
       "      <td>不是</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "       0  1   2   3   4\n",
       "是否陪伴   0  0   0   1   1\n",
       "是否玩游戏  1  1   0   1   1\n",
       "渣男     是  是  不是  不是  不是"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet.T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算第0列的信息增益："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4199730940219749"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "a = (3/5)*(-(2/3)*np.log2(2/3)-(1/3)*np.log2(1/3))\n",
    "calEnt(dataSet)-a"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "计算第1列的信息增益："
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.17095059445466854"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "b = (4/5)*(-(2/4)*np.log2(2/4)-(2/4)*np.log2(2/4))\n",
    "calEnt(dataSet)-b"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 划分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 定义信息熵\n",
    "def calEnt(dataSet):\n",
    "    n = dataSet.shape[0]                              # 数据集总行数\n",
    "    iset = dataSet.iloc[:,-1].value_counts()          # 统计标签的所有类别\n",
    "    p = iset/n                                        # 统计每一类标签所占比\n",
    "    ent = (-p*np.log2(p)).sum()                       # 计算信息熵\n",
    "    return ent\n",
    "\n",
    "# 选择最优的列进行切分\n",
    "def bestSplit(dataSet):\n",
    "    baseEnt = calEnt(dataSet)                                # 计算原始熵\n",
    "    bestGain = 0                                             # 初始化信息增益\n",
    "    axis = -1                                                # 初始化最佳切分列，标签列\n",
    "    \n",
    "    for i in range(dataSet.shape[1]-1):                      # 对特征的每一列进行循环\n",
    "        levels= dataSet.iloc[:,i].value_counts().index       # 提取出当前列的所有取值\n",
    "        ents = 0                                             # 初始化子节点的信息熵\n",
    "        \n",
    "        for j in levels:                                     # 对当前列的每一个取值进行循环\n",
    "            childSet = dataSet[dataSet.iloc[:,i]==j]         # 某一个子节点的dataframe\n",
    "            ent = calEnt(childSet)                           # 计算某一个子节点的信息熵\n",
    "            ents += (childSet.shape[0]/dataSet.shape[0])*ent # 计算当前列的信息熵\n",
    "        print('第{}列的信息熵为{}'.format(i,ents))\n",
    "            \n",
    "        infoGain = baseEnt-ents                              # 计算当前列的信息增益\n",
    "        print('第{}列的信息增益为{}\\n'.format(i,infoGain))\n",
    "        \n",
    "        if (infoGain > bestGain):\n",
    "            bestGain = infoGain                              # 选择最大信息增益\n",
    "            axis = i                                         # 最大信息增益所在列的索引\n",
    "    print(\"第{}列为最优切分列\".format(axis))\n",
    "    return axis"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0列的信息熵为0.5509775004326937\n",
      "第0列的信息增益为0.4199730940219749\n",
      "\n",
      "第1列的信息熵为0.8\n",
      "第1列的信息增益为0.17095059445466854\n",
      "\n",
      "第0列为最优切分列\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "0"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "bestSplit(dataSet)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 按照给定列切分数据集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [],
   "source": [
    "#为决策树进一步划分去做准备\n",
    "def mySplit(dataSet,axis,value):\n",
    "    col = dataSet.columns[axis]\n",
    "    redataSet = dataSet.loc[dataSet[col]==value,:].drop(col,axis=1)\n",
    "    return redataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否玩游戏  渣男\n",
       "3      1  不是\n",
       "4      1  不是"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#验证函数：以axis=0，value=1为例\n",
    "mySplit(dataSet,0,1)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ID3算法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [],
   "source": [
    "\"\"\"\n",
    "函数功能：基于最大信息增益切分数据集，递归构建决策树\n",
    "参数说明：\n",
    "dataSet：原始数据集(最有一列是标签)\n",
    "return：myTree：字典形式的树\n",
    "\"\"\"\n",
    "def createTree(dataSet):\n",
    "    featlist = list(dataSet.columns)                        # 提取出数据集所有的列\n",
    "    classlist = dataSet.iloc[:,-1].value_counts()           # 获取最后一列类标签\n",
    "    \n",
    "    # 判断最多标签数目是否等于数据集行数，或者数据集是否只有一列\n",
    "    if classlist[0]==dataSet.shape[0] or dataSet.shape[1] == 1:\n",
    "        return classlist.index[0]                           # 如果是，返回类标签\n",
    "   \n",
    "    axis = bestSplit(dataSet)                               # 确定出当前最佳切分列的索引\n",
    "    bestfeat = featlist[axis]                               # 获取该索引对应的特征\n",
    "    myTree = {bestfeat:{}}                                  # 采用字典嵌套的方式存储树信息\n",
    "    del featlist[axis]                                      # 删除当前特征\n",
    "    valuelist = set(dataSet.iloc[:,axis])                   # 提取最佳切分列所有属性值\n",
    "    \n",
    "    for value in valuelist:                                 # 对每一个属性值递归建树\n",
    "        myTree[bestfeat][value] = createTree(mySplit(dataSet,axis,value))\n",
    "    \n",
    "    return myTree"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>是否陪伴</th>\n",
       "      <th>是否玩游戏</th>\n",
       "      <th>渣男</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>0</td>\n",
       "      <td>1</td>\n",
       "      <td>是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>0</td>\n",
       "      <td>0</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>1</td>\n",
       "      <td>1</td>\n",
       "      <td>不是</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ],
      "text/plain": [
       "   是否陪伴  是否玩游戏  渣男\n",
       "0     0      1   是\n",
       "1     0      1   是\n",
       "2     0      0  不是\n",
       "3     1      1  不是\n",
       "4     1      1  不是"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dataSet"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "第0列的信息熵为0.5509775004326937\n",
      "第0列的信息增益为0.4199730940219749\n",
      "\n",
      "第1列的信息熵为0.8\n",
      "第1列的信息增益为0.17095059445466854\n",
      "\n",
      "第0列为最优切分列\n",
      "第0列的信息熵为0.0\n",
      "第0列的信息增益为0.9182958340544896\n",
      "\n",
      "第0列为最优切分列\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'是否陪伴': {0: {'是否玩游戏': {0: '不是', 1: '是'}}, 1: '不是'}}"
      ]
     },
     "execution_count": 74,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "createTree(dataSet)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# sklearn 实现决策树分类"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 导入相关包"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 导入需要的算法库和模块\n",
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "from sklearn import tree\n",
    "from sklearn.datasets import load_wine\n",
    "from sklearn.model_selection import train_test_split\n",
    "\n",
    "plt.rcParams['font.sans-serif']=['Simhei']\n",
    "plt.rcParams['axes.unicode_minus']=False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 探索数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array(['class_0', 'class_1', 'class_2'], dtype='<U7')"
      ]
     },
     "execution_count": 22,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "wine = load_wine()\n",
    "\n",
    "wine.data.shape #特征X\n",
    "wine.target  #标签y\n",
    "wine.feature_names\n",
    "wine.target_names"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>酒精</th>\n",
       "      <th>苹果酸</th>\n",
       "      <th>灰</th>\n",
       "      <th>灰的碱性</th>\n",
       "      <th>镁</th>\n",
       "      <th>总酚</th>\n",
       "      <th>类黄酮</th>\n",
       "      <th>非黄烷类酚类</th>\n",
       "      <th>花青素</th>\n",
       "      <th>颜色强度</th>\n",
       "      <th>色调</th>\n",
       "      <th>od280/od315 稀释葡萄酒</th>\n",
       "      <th>脯氨酸</th>\n",
       "      <th>标签</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>14.23</td>\n",
       "      <td>1.71</td>\n",
       "      <td>2.43</td>\n",
       "      <td>15.6</td>\n",
       "      <td>127.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.06</td>\n",
       "      <td>0.28</td>\n",
       "      <td>2.29</td>\n",
       "      <td>5.64</td>\n",
       "      <td>1.04</td>\n",
       "      <td>3.92</td>\n",
       "      <td>1065.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>13.20</td>\n",
       "      <td>1.78</td>\n",
       "      <td>2.14</td>\n",
       "      <td>11.2</td>\n",
       "      <td>100.0</td>\n",
       "      <td>2.65</td>\n",
       "      <td>2.76</td>\n",
       "      <td>0.26</td>\n",
       "      <td>1.28</td>\n",
       "      <td>4.38</td>\n",
       "      <td>1.05</td>\n",
       "      <td>3.40</td>\n",
       "      <td>1050.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>13.16</td>\n",
       "      <td>2.36</td>\n",
       "      <td>2.67</td>\n",
       "      <td>18.6</td>\n",
       "      <td>101.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>3.24</td>\n",
       "      <td>0.30</td>\n",
       "      <td>2.81</td>\n",
       "      <td>5.68</td>\n",
       "      <td>1.03</td>\n",
       "      <td>3.17</td>\n",
       "      <td>1185.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>14.37</td>\n",
       "      <td>1.95</td>\n",
       "      <td>2.50</td>\n",
       "      <td>16.8</td>\n",
       "      <td>113.0</td>\n",
       "      <td>3.85</td>\n",
       "      <td>3.49</td>\n",
       "      <td>0.24</td>\n",
       "      <td>2.18</td>\n",
       "      <td>7.80</td>\n",
       "      <td>0.86</td>\n",
       "      <td>3.45</td>\n",
       "      <td>1480.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>13.24</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.87</td>\n",
       "      <td>21.0</td>\n",
       "      <td>118.0</td>\n",
       "      <td>2.80</td>\n",
       "      <td>2.69</td>\n",
       "      <td>0.39</td>\n",
       "      <td>1.82</td>\n",
       "      <td>4.32</td>\n",
       "      <td>1.04</td>\n",
       "      <td>2.93</td>\n",
       "      <td>735.0</td>\n",
       "      <td>0.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>...</th>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "      <td>...</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>173</th>\n",
       "      <td>13.71</td>\n",
       "      <td>5.65</td>\n",
       "      <td>2.45</td>\n",
       "      <td>20.5</td>\n",
       "      <td>95.0</td>\n",
       "      <td>1.68</td>\n",
       "      <td>0.61</td>\n",
       "      <td>0.52</td>\n",
       "      <td>1.06</td>\n",
       "      <td>7.70</td>\n",
       "      <td>0.64</td>\n",
       "      <td>1.74</td>\n",
       "      <td>740.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>174</th>\n",
       "      <td>13.40</td>\n",
       "      <td>3.91</td>\n",
       "      <td>2.48</td>\n",
       "      <td>23.0</td>\n",
       "      <td>102.0</td>\n",
       "      <td>1.80</td>\n",
       "      <td>0.75</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.41</td>\n",
       "      <td>7.30</td>\n",
       "      <td>0.70</td>\n",
       "      <td>1.56</td>\n",
       "      <td>750.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>175</th>\n",
       "      <td>13.27</td>\n",
       "      <td>4.28</td>\n",
       "      <td>2.26</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120.0</td>\n",
       "      <td>1.59</td>\n",
       "      <td>0.69</td>\n",
       "      <td>0.43</td>\n",
       "      <td>1.35</td>\n",
       "      <td>10.20</td>\n",
       "      <td>0.59</td>\n",
       "      <td>1.56</td>\n",
       "      <td>835.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>176</th>\n",
       "      <td>13.17</td>\n",
       "      <td>2.59</td>\n",
       "      <td>2.37</td>\n",
       "      <td>20.0</td>\n",
       "      <td>120.0</td>\n",
       "      <td>1.65</td>\n",
       "      <td>0.68</td>\n",
       "      <td>0.53</td>\n",
       "      <td>1.46</td>\n",
       "      <td>9.30</td>\n",
       "      <td>0.60</td>\n",
       "      <td>1.62</td>\n",
       "      <td>840.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>177</th>\n",
       "      <td>14.13</td>\n",
       "      <td>4.10</td>\n",
       "      <td>2.74</td>\n",
       "      <td>24.5</td>\n",
       "      <td>96.0</td>\n",
       "      <td>2.05</td>\n",
       "      <td>0.76</td>\n",
       "      <td>0.56</td>\n",
       "      <td>1.35</td>\n",
       "      <td>9.20</td>\n",
       "      <td>0.61</td>\n",
       "      <td>1.60</td>\n",
       "      <td>560.0</td>\n",
       "      <td>2.0</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "<p>178 rows × 14 columns</p>\n",
       "</div>"
      ],
      "text/plain": [
       "        酒精   苹果酸     灰  灰的碱性      镁    总酚   类黄酮  非黄烷类酚类   花青素   颜色强度    色调  \\\n",
       "0    14.23  1.71  2.43  15.6  127.0  2.80  3.06    0.28  2.29   5.64  1.04   \n",
       "1    13.20  1.78  2.14  11.2  100.0  2.65  2.76    0.26  1.28   4.38  1.05   \n",
       "2    13.16  2.36  2.67  18.6  101.0  2.80  3.24    0.30  2.81   5.68  1.03   \n",
       "3    14.37  1.95  2.50  16.8  113.0  3.85  3.49    0.24  2.18   7.80  0.86   \n",
       "4    13.24  2.59  2.87  21.0  118.0  2.80  2.69    0.39  1.82   4.32  1.04   \n",
       "..     ...   ...   ...   ...    ...   ...   ...     ...   ...    ...   ...   \n",
       "173  13.71  5.65  2.45  20.5   95.0  1.68  0.61    0.52  1.06   7.70  0.64   \n",
       "174  13.40  3.91  2.48  23.0  102.0  1.80  0.75    0.43  1.41   7.30  0.70   \n",
       "175  13.27  4.28  2.26  20.0  120.0  1.59  0.69    0.43  1.35  10.20  0.59   \n",
       "176  13.17  2.59  2.37  20.0  120.0  1.65  0.68    0.53  1.46   9.30  0.60   \n",
       "177  14.13  4.10  2.74  24.5   96.0  2.05  0.76    0.56  1.35   9.20  0.61   \n",
       "\n",
       "     od280/od315 稀释葡萄酒     脯氨酸   标签  \n",
       "0                 3.92  1065.0  0.0  \n",
       "1                 3.40  1050.0  0.0  \n",
       "2                 3.17  1185.0  0.0  \n",
       "3                 3.45  1480.0  0.0  \n",
       "4                 2.93   735.0  0.0  \n",
       "..                 ...     ...  ...  \n",
       "173               1.74   740.0  2.0  \n",
       "174               1.56   750.0  2.0  \n",
       "175               1.56   835.0  2.0  \n",
       "176               1.62   840.0  2.0  \n",
       "177               1.60   560.0  2.0  \n",
       "\n",
       "[178 rows x 14 columns]"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#合成数据\n",
    "data =np.concatenate((wine.data,wine.target.reshape(-1,1)),axis=1)\n",
    "names = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315 稀释葡萄酒','脯氨酸','标签']\n",
    "#合成dataframe\n",
    "wine_df = pd.DataFrame(data=data,columns=names)\n",
    "wine_df"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 178 entries, 0 to 177\n",
      "Data columns (total 14 columns):\n",
      " #   Column             Non-Null Count  Dtype  \n",
      "---  ------             --------------  -----  \n",
      " 0   酒精                 178 non-null    float64\n",
      " 1   苹果酸                178 non-null    float64\n",
      " 2   灰                  178 non-null    float64\n",
      " 3   灰的碱性               178 non-null    float64\n",
      " 4   镁                  178 non-null    float64\n",
      " 5   总酚                 178 non-null    float64\n",
      " 6   类黄酮                178 non-null    float64\n",
      " 7   非黄烷类酚类             178 non-null    float64\n",
      " 8   花青素                178 non-null    float64\n",
      " 9   颜色强度               178 non-null    float64\n",
      " 10  色调                 178 non-null    float64\n",
      " 11  od280/od315 稀释葡萄酒  178 non-null    float64\n",
      " 12  脯氨酸                178 non-null    float64\n",
      " 13  标签                 178 non-null    float64\n",
      "dtypes: float64(14)\n",
      "memory usage: 19.6 KB\n"
     ]
    }
   ],
   "source": [
    "wine_df.info()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 建模"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 划分训练集和测试集"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [],
   "source": [
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine_df.iloc[:,:-1],\n",
    "                                             wine_df.iloc[:,-1],\n",
    "                                             test_size=0.3,\n",
    "                                             random_state=420)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(124, 13)"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "Xtrain.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 初步生成决策树"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.tree import DecisionTreeClassifier"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9629629629629629"
      ]
     },
     "execution_count": 19,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = DecisionTreeClassifier(criterion='entropy') #生成决策树分类器   entropy\n",
    "clf = clf.fit(Xtrain,Ytrain)\n",
    "\n",
    "clf.score(Xtest,Ytest) #得到准确率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'0.15'"
      ]
     },
     "execution_count": 21,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "import graphviz  # pip install graphviz\n",
    "graphviz.__version__"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [],
   "source": [
    "feature_names = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315 稀释葡萄酒','脯氨酸']"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
       " -->\r\n",
       "<!-- Title: Tree Pages: 1 -->\r\n",
       "<svg width=\"636pt\" height=\"552pt\"\r\n",
       " viewBox=\"0.00 0.00 635.50 552.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 548)\">\r\n",
       "<title>Tree</title>\r\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-548 631.5,-548 631.5,4 -4,4\"/>\r\n",
       "<!-- 0 -->\r\n",
       "<g id=\"node1\" class=\"node\"><title>0</title>\r\n",
       "<polygon fill=\"#dbfae8\" stroke=\"black\" points=\"314.5,-544 189.5,-544 189.5,-461 314.5,-461 314.5,-544\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-528.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">类黄酮 &lt;= 1.575</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-513.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 1.557</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-498.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 124</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-483.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 53, 37]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-468.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 1 -->\r\n",
       "<g id=\"node2\" class=\"node\"><title>1</title>\r\n",
       "<polygon fill=\"#a36fec\" stroke=\"black\" points=\"243.5,-425 124.5,-425 124.5,-342 243.5,-342 243.5,-425\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-409.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">色调 &lt;= 0.92</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-394.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.747</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-379.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 47</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-364.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 10, 37]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-349.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 贝尔摩德</text>\r\n",
       "</g>\r\n",
       "<!-- 0&#45;&gt;1 -->\r\n",
       "<g id=\"edge1\" class=\"edge\"><title>0&#45;&gt;1</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M228.408,-460.907C223.344,-452.195 217.94,-442.897 212.707,-433.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"215.602,-431.908 207.551,-425.021 209.549,-435.425 215.602,-431.908\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"201.15\" y=\"-445.487\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">True</text>\r\n",
       "</g>\r\n",
       "<!-- 6 -->\r\n",
       "<g id=\"node7\" class=\"node\"><title>6</title>\r\n",
       "<polygon fill=\"#d6fae5\" stroke=\"black\" points=\"380.5,-425 261.5,-425 261.5,-342 380.5,-342 380.5,-425\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-409.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">酒精 &lt;= 12.785</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-394.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.99</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-379.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 77</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-364.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 43, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-349.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 0&#45;&gt;6 -->\r\n",
       "<g id=\"edge6\" class=\"edge\"><title>0&#45;&gt;6</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M275.939,-460.907C281.077,-452.195 286.561,-442.897 291.871,-433.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"295.038,-435.412 297.103,-425.021 289.008,-431.857 295.038,-435.412\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"303.35\" y=\"-445.528\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">False</text>\r\n",
       "</g>\r\n",
       "<!-- 2 -->\r\n",
       "<g id=\"node3\" class=\"node\"><title>2</title>\r\n",
       "<polygon fill=\"#8139e5\" stroke=\"black\" points=\"112,-298.5 7.10543e-015,-298.5 7.10543e-015,-230.5 112,-230.5 112,-298.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-283.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-268.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 36</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-253.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 0, 36]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-238.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 贝尔摩德</text>\r\n",
       "</g>\r\n",
       "<!-- 1&#45;&gt;2 -->\r\n",
       "<g id=\"edge2\" class=\"edge\"><title>1&#45;&gt;2</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M139.591,-341.907C126.674,-330.101 112.579,-317.217 99.7055,-305.45\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.028,-302.83 92.2852,-298.667 97.3049,-307.997 102.028,-302.83\"/>\r\n",
       "</g>\r\n",
       "<!-- 3 -->\r\n",
       "<g id=\"node4\" class=\"node\"><title>3</title>\r\n",
       "<polygon fill=\"#4de88e\" stroke=\"black\" points=\"242,-306 130,-306 130,-223 242,-223 242,-306\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-290.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">酒精 &lt;= 13.515</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-275.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.439</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-260.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 11</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-245.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 10, 1]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-230.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 1&#45;&gt;3 -->\r\n",
       "<g id=\"edge3\" class=\"edge\"><title>1&#45;&gt;3</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M184.694,-341.907C184.837,-333.558 184.989,-324.671 185.136,-316.02\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"188.636,-316.079 185.307,-306.021 181.637,-315.959 188.636,-316.079\"/>\r\n",
       "</g>\r\n",
       "<!-- 4 -->\r\n",
       "<g id=\"node5\" class=\"node\"><title>4</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"115,-179.5 3,-179.5 3,-111.5 115,-111.5 115,-179.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"59\" y=\"-164.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"59\" y=\"-149.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 10</text>\r\n",
       "<text text-anchor=\"middle\" x=\"59\" y=\"-134.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 10, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"59\" y=\"-119.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 3&#45;&gt;4 -->\r\n",
       "<g id=\"edge4\" class=\"edge\"><title>3&#45;&gt;4</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M141.938,-222.907C129.122,-211.101 115.137,-198.217 102.364,-186.45\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"104.728,-183.868 95.0017,-179.667 99.985,-189.017 104.728,-183.868\"/>\r\n",
       "</g>\r\n",
       "<!-- 5 -->\r\n",
       "<g id=\"node6\" class=\"node\"><title>5</title>\r\n",
       "<polygon fill=\"#8139e5\" stroke=\"black\" points=\"244.5,-179.5 133.5,-179.5 133.5,-111.5 244.5,-111.5 244.5,-179.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"189\" y=\"-164.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"189\" y=\"-149.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 1</text>\r\n",
       "<text text-anchor=\"middle\" x=\"189\" y=\"-134.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 0, 1]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"189\" y=\"-119.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 贝尔摩德</text>\r\n",
       "</g>\r\n",
       "<!-- 3&#45;&gt;5 -->\r\n",
       "<g id=\"edge5\" class=\"edge\"><title>3&#45;&gt;5</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M187.041,-222.907C187.315,-212.204 187.612,-200.615 187.89,-189.776\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"191.392,-189.753 188.15,-179.667 184.394,-189.574 191.392,-189.753\"/>\r\n",
       "</g>\r\n",
       "<!-- 7 -->\r\n",
       "<g id=\"node8\" class=\"node\"><title>7</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"375,-298.5 263,-298.5 263,-230.5 375,-230.5 375,-298.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-283.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-268.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 38</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-253.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 38, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-238.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 6&#45;&gt;7 -->\r\n",
       "<g id=\"edge7\" class=\"edge\"><title>6&#45;&gt;7</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.306,-341.907C320.123,-331.204 319.925,-319.615 319.74,-308.776\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"323.237,-308.606 319.567,-298.667 316.238,-308.725 323.237,-308.606\"/>\r\n",
       "</g>\r\n",
       "<!-- 8 -->\r\n",
       "<g id=\"node9\" class=\"node\"><title>8</title>\r\n",
       "<polygon fill=\"#e99456\" stroke=\"black\" points=\"505,-306 393,-306 393,-223 505,-223 505,-306\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-290.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">脯氨酸 &lt;= 655.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-275.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.552</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-260.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 39</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-245.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 5, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-230.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 6&#45;&gt;8 -->\r\n",
       "<g id=\"edge8\" class=\"edge\"><title>6&#45;&gt;8</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M365.409,-341.907C375.635,-332.56 386.6,-322.538 397.112,-312.929\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"399.65,-315.351 404.67,-306.021 394.927,-310.184 399.65,-315.351\"/>\r\n",
       "</g>\r\n",
       "<!-- 9 -->\r\n",
       "<g id=\"node10\" class=\"node\"><title>9</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"437.5,-179.5 332.5,-179.5 332.5,-111.5 437.5,-111.5 437.5,-179.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"385\" y=\"-164.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"385\" y=\"-149.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 4</text>\r\n",
       "<text text-anchor=\"middle\" x=\"385\" y=\"-134.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 4, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"385\" y=\"-119.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 8&#45;&gt;9 -->\r\n",
       "<g id=\"edge9\" class=\"edge\"><title>8&#45;&gt;9</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M426.796,-222.907C420.76,-211.873 414.209,-199.898 408.124,-188.773\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"411.012,-186.76 403.143,-179.667 404.871,-190.12 411.012,-186.76\"/>\r\n",
       "</g>\r\n",
       "<!-- 10 -->\r\n",
       "<g id=\"node11\" class=\"node\"><title>10</title>\r\n",
       "<polygon fill=\"#e6853f\" stroke=\"black\" points=\"568,-187 456,-187 456,-104 568,-104 568,-187\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"512\" y=\"-171.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">色调 &lt;= 1.295</text>\r\n",
       "<text text-anchor=\"middle\" x=\"512\" y=\"-156.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.187</text>\r\n",
       "<text text-anchor=\"middle\" x=\"512\" y=\"-141.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 35</text>\r\n",
       "<text text-anchor=\"middle\" x=\"512\" y=\"-126.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 1, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"512\" y=\"-111.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 8&#45;&gt;10 -->\r\n",
       "<g id=\"edge10\" class=\"edge\"><title>8&#45;&gt;10</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M470.858,-222.907C475.549,-214.195 480.556,-204.897 485.404,-195.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"488.522,-197.485 490.181,-187.021 482.358,-194.166 488.522,-197.485\"/>\r\n",
       "</g>\r\n",
       "<!-- 11 -->\r\n",
       "<g id=\"node12\" class=\"node\"><title>11</title>\r\n",
       "<polygon fill=\"#e58139\" stroke=\"black\" points=\"504,-68 392,-68 392,-0 504,-0 504,-68\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"448\" y=\"-52.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"448\" y=\"-37.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 34</text>\r\n",
       "<text text-anchor=\"middle\" x=\"448\" y=\"-22.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 0, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"448\" y=\"-7.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 10&#45;&gt;11 -->\r\n",
       "<g id=\"edge11\" class=\"edge\"><title>10&#45;&gt;11</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M488.169,-103.726C483.104,-95.0615 477.748,-85.8962 472.653,-77.1802\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"475.531,-75.167 467.463,-68.2996 469.487,-78.6992 475.531,-75.167\"/>\r\n",
       "</g>\r\n",
       "<!-- 12 -->\r\n",
       "<g id=\"node13\" class=\"node\"><title>12</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"627.5,-68 522.5,-68 522.5,-0 627.5,-0 627.5,-68\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"575\" y=\"-52.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"575\" y=\"-37.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 1</text>\r\n",
       "<text text-anchor=\"middle\" x=\"575\" y=\"-22.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 1, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"575\" y=\"-7.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 10&#45;&gt;12 -->\r\n",
       "<g id=\"edge12\" class=\"edge\"><title>10&#45;&gt;12</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M535.459,-103.726C540.444,-95.0615 545.717,-85.8962 550.732,-77.1802\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"553.888,-78.7128 555.841,-68.2996 547.821,-75.2219 553.888,-78.7128\"/>\r\n",
       "</g>\r\n",
       "</g>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x202faa76730>"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "dot_data = tree.export_graphviz(clf\n",
    "                     ,feature_names = feature_names #Xtrain 特征列\n",
    "                     ,class_names = [\"琴酒\",\"雪莉\",\"贝尔摩德\"] #y标签\n",
    "                     ,filled=True #渲染颜色\n",
    "                    )\n",
    "graph = graphviz.Source(dot_data,filename='决策树.pdf')\n",
    "graph"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 30,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "'wine.pdf'"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "graph.render('wine')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 探索决策树属性"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 32,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.30840074, 0.        , 0.        , 0.        , 0.        ,\n",
       "       0.        , 0.42318016, 0.        , 0.        , 0.        ,\n",
       "       0.19072576, 0.        , 0.07769335])"
      ]
     },
     "execution_count": 32,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#显示每个特征的重要程度\n",
    "clf.feature_importances_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 33,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[('酒精', 0.3084007387929411),\n",
       " ('苹果酸', 0.0),\n",
       " ('灰', 0.0),\n",
       " ('灰的碱性', 0.0),\n",
       " ('镁', 0.0),\n",
       " ('总酚', 0.0),\n",
       " ('类黄酮', 0.4231801558053247),\n",
       " ('非黄烷类酚类', 0.0),\n",
       " ('花青素', 0.0),\n",
       " ('颜色强度', 0.0),\n",
       " ('色调', 0.19072575820477977),\n",
       " ('od280/od315 稀释葡萄酒', 0.0),\n",
       " ('脯氨酸', 0.07769334719695445)]"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "[*zip(feature_names,clf.feature_importances_)]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.apply"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 35,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 7,  5,  7,  7,  2, 11,  7,  2,  7,  7,  2, 11,  7,  7,  2,  2,  7,\n",
       "       11,  2,  7,  2, 11,  4,  4,  2,  2, 11,  7,  2,  2,  7, 11, 11, 11,\n",
       "       11,  2,  7, 11,  7, 11, 11,  2,  7, 11, 11,  9,  7, 11,  4,  7,  7,\n",
       "        2,  2,  7, 11,  4, 11,  7, 11,  7,  2,  2, 11, 11, 11, 11,  7,  7,\n",
       "       11,  2,  7,  2,  2,  7,  4,  2,  7,  4,  7,  2,  7, 11,  4,  2,  7,\n",
       "       12,  7,  2,  4,  9, 11,  2,  7, 11, 11,  4, 11, 11,  4,  7,  2,  7,\n",
       "        2,  7,  2,  9, 11, 11,  7,  2,  2, 11,  2,  2,  7,  2, 11,  2,  7,\n",
       "       11,  7,  2,  9,  2], dtype=int64)"
      ]
     },
     "execution_count": 35,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.apply(Xtrain)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.tree_.node_count"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 36,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "13"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf.tree_.node_count #返回节点个数"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### clf.tree_.feature"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([ 6, 10, -2,  0, -2, -2,  0, -2, 12, -2, 10, -2, -2], dtype=int64)"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    " clf.tree_.feature  #对节点分类   -2是叶节点"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 防止过拟合与剪枝"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 45,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/svg+xml": [
       "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?>\r\n",
       "<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.1//EN\"\r\n",
       " \"http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd\">\r\n",
       "<!-- Generated by graphviz version 2.38.0 (20140413.2041)\r\n",
       " -->\r\n",
       "<!-- Title: Tree Pages: 1 -->\r\n",
       "<svg width=\"639pt\" height=\"552pt\"\r\n",
       " viewBox=\"0.00 0.00 638.50 552.00\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\r\n",
       "<g id=\"graph0\" class=\"graph\" transform=\"scale(1 1) rotate(0) translate(4 548)\">\r\n",
       "<title>Tree</title>\r\n",
       "<polygon fill=\"white\" stroke=\"none\" points=\"-4,4 -4,-548 634.5,-548 634.5,4 -4,4\"/>\r\n",
       "<!-- 0 -->\r\n",
       "<g id=\"node1\" class=\"node\"><title>0</title>\r\n",
       "<polygon fill=\"#dbfae8\" stroke=\"black\" points=\"314.5,-544 189.5,-544 189.5,-461 314.5,-461 314.5,-544\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-528.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">类黄酮 &lt;= 1.575</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-513.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 1.557</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-498.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 124</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-483.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 53, 37]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"252\" y=\"-468.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 1 -->\r\n",
       "<g id=\"node2\" class=\"node\"><title>1</title>\r\n",
       "<polygon fill=\"#a36fec\" stroke=\"black\" points=\"243.5,-425 124.5,-425 124.5,-342 243.5,-342 243.5,-425\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-409.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">色调 &lt;= 0.92</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-394.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.747</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-379.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 47</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-364.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 10, 37]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"184\" y=\"-349.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 贝尔摩德</text>\r\n",
       "</g>\r\n",
       "<!-- 0&#45;&gt;1 -->\r\n",
       "<g id=\"edge1\" class=\"edge\"><title>0&#45;&gt;1</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M228.408,-460.907C223.344,-452.195 217.94,-442.897 212.707,-433.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"215.602,-431.908 207.551,-425.021 209.549,-435.425 215.602,-431.908\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"201.15\" y=\"-445.487\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">True</text>\r\n",
       "</g>\r\n",
       "<!-- 4 -->\r\n",
       "<g id=\"node5\" class=\"node\"><title>4</title>\r\n",
       "<polygon fill=\"#d6fae5\" stroke=\"black\" points=\"380.5,-425 261.5,-425 261.5,-342 380.5,-342 380.5,-425\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-409.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">酒精 &lt;= 12.785</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-394.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.99</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-379.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 77</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-364.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 43, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"321\" y=\"-349.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 0&#45;&gt;4 -->\r\n",
       "<g id=\"edge4\" class=\"edge\"><title>0&#45;&gt;4</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M275.939,-460.907C281.077,-452.195 286.561,-442.897 291.871,-433.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"295.038,-435.412 297.103,-425.021 289.008,-431.857 295.038,-435.412\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"303.35\" y=\"-445.528\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">False</text>\r\n",
       "</g>\r\n",
       "<!-- 2 -->\r\n",
       "<g id=\"node3\" class=\"node\"><title>2</title>\r\n",
       "<polygon fill=\"#8139e5\" stroke=\"black\" points=\"112,-298.5 7.10543e-015,-298.5 7.10543e-015,-230.5 112,-230.5 112,-298.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-283.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-268.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 36</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-253.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 0, 36]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"56\" y=\"-238.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 贝尔摩德</text>\r\n",
       "</g>\r\n",
       "<!-- 1&#45;&gt;2 -->\r\n",
       "<g id=\"edge2\" class=\"edge\"><title>1&#45;&gt;2</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M139.591,-341.907C126.674,-330.101 112.579,-317.217 99.7055,-305.45\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"102.028,-302.83 92.2852,-298.667 97.3049,-307.997 102.028,-302.83\"/>\r\n",
       "</g>\r\n",
       "<!-- 3 -->\r\n",
       "<g id=\"node4\" class=\"node\"><title>3</title>\r\n",
       "<polygon fill=\"#4de88e\" stroke=\"black\" points=\"242,-298.5 130,-298.5 130,-230.5 242,-230.5 242,-298.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-283.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.439</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-268.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 11</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-253.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 10, 1]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"186\" y=\"-238.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 1&#45;&gt;3 -->\r\n",
       "<g id=\"edge3\" class=\"edge\"><title>1&#45;&gt;3</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M184.694,-341.907C184.877,-331.204 185.075,-319.615 185.26,-308.776\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"188.762,-308.725 185.433,-298.667 181.763,-308.606 188.762,-308.725\"/>\r\n",
       "</g>\r\n",
       "<!-- 5 -->\r\n",
       "<g id=\"node6\" class=\"node\"><title>5</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"375,-298.5 263,-298.5 263,-230.5 375,-230.5 375,-298.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-283.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-268.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 38</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-253.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 38, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"319\" y=\"-238.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 4&#45;&gt;5 -->\r\n",
       "<g id=\"edge5\" class=\"edge\"><title>4&#45;&gt;5</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M320.306,-341.907C320.123,-331.204 319.925,-319.615 319.74,-308.776\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"323.237,-308.606 319.567,-298.667 316.238,-308.725 323.237,-308.606\"/>\r\n",
       "</g>\r\n",
       "<!-- 6 -->\r\n",
       "<g id=\"node7\" class=\"node\"><title>6</title>\r\n",
       "<polygon fill=\"#e99456\" stroke=\"black\" points=\"505,-306 393,-306 393,-223 505,-223 505,-306\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-290.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">脯氨酸 &lt;= 655.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-275.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.552</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-260.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 39</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-245.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 5, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"449\" y=\"-230.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 4&#45;&gt;6 -->\r\n",
       "<g id=\"edge6\" class=\"edge\"><title>4&#45;&gt;6</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M365.409,-341.907C375.635,-332.56 386.6,-322.538 397.112,-312.929\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"399.65,-315.351 404.67,-306.021 394.927,-310.184 399.65,-315.351\"/>\r\n",
       "</g>\r\n",
       "<!-- 7 -->\r\n",
       "<g id=\"node8\" class=\"node\"><title>7</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"435.5,-179.5 330.5,-179.5 330.5,-111.5 435.5,-111.5 435.5,-179.5\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"383\" y=\"-164.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"383\" y=\"-149.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 4</text>\r\n",
       "<text text-anchor=\"middle\" x=\"383\" y=\"-134.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 4, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"383\" y=\"-119.3\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 6&#45;&gt;7 -->\r\n",
       "<g id=\"edge7\" class=\"edge\"><title>6&#45;&gt;7</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M426.102,-222.907C419.815,-211.763 412.987,-199.658 406.658,-188.439\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"409.671,-186.657 401.71,-179.667 403.574,-190.096 409.671,-186.657\"/>\r\n",
       "</g>\r\n",
       "<!-- 8 -->\r\n",
       "<g id=\"node9\" class=\"node\"><title>8</title>\r\n",
       "<polygon fill=\"#e6853f\" stroke=\"black\" points=\"576,-187 454,-187 454,-104 576,-104 576,-187\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"515\" y=\"-171.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">灰的碱性 &lt;= 26.25</text>\r\n",
       "<text text-anchor=\"middle\" x=\"515\" y=\"-156.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.187</text>\r\n",
       "<text text-anchor=\"middle\" x=\"515\" y=\"-141.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 35</text>\r\n",
       "<text text-anchor=\"middle\" x=\"515\" y=\"-126.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 1, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"515\" y=\"-111.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 6&#45;&gt;8 -->\r\n",
       "<g id=\"edge8\" class=\"edge\"><title>6&#45;&gt;8</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M471.898,-222.907C476.813,-214.195 482.058,-204.897 487.137,-195.893\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"490.277,-197.45 492.142,-187.021 484.18,-194.011 490.277,-197.45\"/>\r\n",
       "</g>\r\n",
       "<!-- 9 -->\r\n",
       "<g id=\"node10\" class=\"node\"><title>9</title>\r\n",
       "<polygon fill=\"#e58139\" stroke=\"black\" points=\"507,-68 395,-68 395,-0 507,-0 507,-68\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"451\" y=\"-52.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"451\" y=\"-37.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 34</text>\r\n",
       "<text text-anchor=\"middle\" x=\"451\" y=\"-22.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [34, 0, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"451\" y=\"-7.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 琴酒</text>\r\n",
       "</g>\r\n",
       "<!-- 8&#45;&gt;9 -->\r\n",
       "<g id=\"edge9\" class=\"edge\"><title>8&#45;&gt;9</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M491.169,-103.726C486.104,-95.0615 480.748,-85.8962 475.653,-77.1802\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"478.531,-75.167 470.463,-68.2996 472.487,-78.6992 478.531,-75.167\"/>\r\n",
       "</g>\r\n",
       "<!-- 10 -->\r\n",
       "<g id=\"node11\" class=\"node\"><title>10</title>\r\n",
       "<polygon fill=\"#39e581\" stroke=\"black\" points=\"630.5,-68 525.5,-68 525.5,-0 630.5,-0 630.5,-68\"/>\r\n",
       "<text text-anchor=\"middle\" x=\"578\" y=\"-52.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">entropy = 0.0</text>\r\n",
       "<text text-anchor=\"middle\" x=\"578\" y=\"-37.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">samples = 1</text>\r\n",
       "<text text-anchor=\"middle\" x=\"578\" y=\"-22.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">value = [0, 1, 0]</text>\r\n",
       "<text text-anchor=\"middle\" x=\"578\" y=\"-7.8\" font-family=\"Times New Roman,serif\" font-size=\"14.00\">class = 雪莉</text>\r\n",
       "</g>\r\n",
       "<!-- 8&#45;&gt;10 -->\r\n",
       "<g id=\"edge10\" class=\"edge\"><title>8&#45;&gt;10</title>\r\n",
       "<path fill=\"none\" stroke=\"black\" d=\"M538.459,-103.726C543.444,-95.0615 548.717,-85.8962 553.732,-77.1802\"/>\r\n",
       "<polygon fill=\"black\" stroke=\"black\" points=\"556.888,-78.7128 558.841,-68.2996 550.821,-75.2219 556.888,-78.7128\"/>\r\n",
       "</g>\r\n",
       "</g>\r\n",
       "</svg>\r\n"
      ],
      "text/plain": [
       "<graphviz.files.Source at 0x202fce16d30>"
      ]
     },
     "execution_count": 45,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf = tree.DecisionTreeClassifier(criterion='entropy'\n",
    "                                 #,max_depth=3  #最大深度\n",
    "                                 #,min_samples_leaf=5 #子节点包含样本最小个数（父节点）\n",
    "                                  ,min_samples_split=20\n",
    "                                 ) #生成决策树分类器   entropy\n",
    "\n",
    "clf = clf.fit(Xtrain,Ytrain)\n",
    "\n",
    "\n",
    "dot_data = tree.export_graphviz(clf\n",
    "                     ,feature_names = feature_names #Xtrain 特征列\n",
    "                     ,class_names = [\"琴酒\",\"雪莉\",\"贝尔摩德\"] #y标签\n",
    "                     ,filled=True #渲染颜色\n",
    "                    )\n",
    "graph = graphviz.Source(dot_data)\n",
    "graph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 确定最优的剪枝参数（学习曲线）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "test= []\n",
    "\n",
    "for i in range(10):\n",
    "    clf = tree.DecisionTreeClassifier(criterion='entropy'\n",
    "                                 ,max_depth=i+1  #最大深度\n",
    "                                 #,min_samples_leaf=5 #子节点包含样本最小个数（父节点）\n",
    "                                  #,min_samples_split=20\n",
    "                                 ,random_state=30\n",
    "                                 ,splitter='random'\n",
    "                                 ) #生成决策树分类器   entropy\n",
    "\n",
    "    clf = clf.fit(Xtrain,Ytrain)\n",
    "    score = clf.score(Xtest,Ytest)\n",
    "    test.append(score)\n",
    "\n",
    "plt.plot(range(1,11),test,color='red')\n",
    "plt.ylabel('score')\n",
    "plt.xlabel('max_depth')\n",
    "plt.xticks(range(1,11))\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 样本不平衡"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.tree import DecisionTreeClassifier\n",
    "from sklearn.datasets import make_blobs #聚类产生数据集的方法"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.collections.PathCollection at 0x20286b7f820>"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "class_1 = 1000   #类别1 样本1000个 \n",
    "class_2 = 100    #类别2 样本100个\n",
    "centers = [[0,0],[2.0,2.0]] #两个类别的中心点\n",
    "clusters_std = [2.5,0.5] #两个类别的方差 \n",
    "\n",
    "X,y = make_blobs(n_samples=[class_1,class_2],\n",
    "          centers=centers,\n",
    "          cluster_std=clusters_std,\n",
    "          random_state=420,shuffle=False)\n",
    "\n",
    "plt.scatter(X[:,0],X[:,1],c=y,cmap='rainbow',s=10)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier()"
      ]
     },
     "execution_count": 61,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#划分数据集\n",
    "Xtrain,Xtest,Ytrain,Ytest = train_test_split(X,y,test_size=0.2,random_state=420)\n",
    "\n",
    "\n",
    "#不设定class_weight\n",
    "clf_01 = DecisionTreeClassifier()\n",
    "\n",
    "clf_01.fit(Xtrain,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "DecisionTreeClassifier(class_weight='balanced')"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#设定class_weight\n",
    "clf_02 = DecisionTreeClassifier(class_weight='balanced')\n",
    "\n",
    "clf_02.fit(Xtrain,Ytrain)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.8954545454545455"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf_01.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.9045454545454545"
      ]
     },
     "execution_count": 64,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "clf_02.score(Xtest,Ytest)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## sk-learn 混淆矩阵库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn import metrics"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 混淆矩阵"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[183,   8],\n",
       "       [ 15,  14]], dtype=int64)"
      ]
     },
     "execution_count": 66,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#平衡前\n",
    "metrics.confusion_matrix(Ytest,clf_01.predict(Xtest))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[182,   9],\n",
       "       [ 12,  17]], dtype=int64)"
      ]
     },
     "execution_count": 67,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#平衡后\n",
    "metrics.confusion_matrix(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 精准率"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6363636363636364"
      ]
     },
     "execution_count": 68,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.precision_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6538461538461539"
      ]
     },
     "execution_count": 69,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.precision_score(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 召回率\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.4827586206896552"
      ]
     },
     "execution_count": 70,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.recall_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5862068965517241"
      ]
     },
     "execution_count": 71,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.recall_score(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### F值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.5490196078431373"
      ]
     },
     "execution_count": 72,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.f1_score(Ytest,clf_01.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "0.6181818181818182"
      ]
     },
     "execution_count": 73,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "metrics.f1_score(Ytest,clf_02.predict(Xtest))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.9.6"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": true,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {
    "height": "calc(100% - 180px)",
    "left": "10px",
    "top": "150px",
    "width": "246.95px"
   },
   "toc_section_display": true,
   "toc_window_display": true
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
